#include<stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include "lcd.h"
#include "bmp.h"
#include "beep.h"
#include "led.h"
#include "ts.h"
#include "serial.h"

    extern   int Lux;
    static int cnt =0;
    void *my_pthread(void *arg)
{
    //1.创建一个socket套接字
    int socket_fd = socket(AF_INET , SOCK_STREAM , 0) ; 
    if(socket_fd == -1)
    {
        printf("create socket error\n");
     
    }

    //2.连接服务器
    //需要一个保存相关信息的一个网络地址结构体变量
    struct sockaddr_in client_addr ; //定义一个网络地址结构体变量
    client_addr.sin_family = AF_INET ; //指定IPV4协议簇
    client_addr.sin_port = htons(8888) ; //指定端口号
    client_addr.sin_addr.s_addr = inet_addr("172.168.31.2"); 
    int ret = connect(socket_fd , (struct sockaddr*)&client_addr , sizeof(client_addr)) ;
    if(ret == -1)
    {
        printf("connect error\n");
        close(socket_fd);
        
    }
    //---------------------已经成功连接服务器--------------------
    printf("connect server sucess !!!\n");

    while (1)
    {
        GY_39();
        // sleep(1);
        // 打印显示区域，设置按键阈值
        LCD_draw_lightword(20,20,24,24,0xff);
        display_sqare(140,20,16*4,24,0x00);
        LCD_draw_num(140,20,16,24,Lux);
        if(Lux<200)
        {
            LED_Ctrl(0,1,0);
            BEEP_Ctrl();
            LED_Ctrl(1,0,1);
        }
        //获取lux并传输给上位机
        char send_buf[128] = {0}; //保存从gy_39的数据
        send_buf[0]=Lux/100%10+48; //从gy_39获取数据
        send_buf[1]=Lux/10%10+48;
        send_buf[2]=Lux%10+48;
        write(socket_fd , send_buf , sizeof(send_buf)) ;
        sleep(1);
    }
        //4.关闭套接字
    close(socket_fd) ;
    
}

//男明星特效
void superstart()
{
    display_bmp("3.bmp", 0, 0);
    int col[]={0x0000ff,0x00ffff,0xff00ff,0x00ff00,0xffff00,0xffffff,0xff0000};
    for(int i=0;i<14;i++)
    {
        LED_Ctrl(i%2,i%2,i%2);
        LCD_draw_start(260,400,56,56,col[i%7]);
        // step2:打开对应的设备文件
        int pwm_fd = open("/dev/pwm",O_RDWR);
        if(pwm_fd == -1)
        {
            printf("BEEP fail");  
        }
		
	    // step3:通过命令去控制蜂鸣器
        unsigned char cmd = 1;	//1-响 0-不响
		write(pwm_fd,&cmd,1);
        usleep(500000);
		cmd = 0;	//1-响 0-不响
		write(pwm_fd,&cmd,1);
        usleep(100000);
	    // step4:关闭文件
        close(pwm_fd);
        
    }
}

int project()
{
    

    // //打印背景图片
    display_bmp("1.bmp", 0, 0);
    
    pthread_t tid;
    pthread_create(&tid,NULL,my_pthread,NULL);

   

    //3.数据的收发
    while(1)
    {
        
         //设置按键1位置
    display_sqare(50,50,50,50,0xff);
    LCD_draw_fmq(50,65,16,16,0xff00);
        //设置按键2位置
    display_sqare(50,150,50,50,0xff00);
    LCD_draw_cbmp(50,165,16,16,0xff0000);
      //设置按键3位置
    display_sqare(50,250,50,50,0xff0000);
        LCD_draw_led(50,265,16,16,0xff00);
        //获取触摸位置
        int x = -1,y = -1;
        Get_xy(&x,&y);
        // printf("x = %d,y = %d\n",x,y);
        //判断x，y轴这个值是否符合你的要求，符合要求做对应的事
        if(x>50&&x<100&&y>50&&y<100)
        BEEP_Ctrl();
        if(x>50&&x<100&&y>150&&y<200)
        {
            cnt++;
            cnt%=4;
            if(cnt==0)
            display_bmp("1.bmp", 0, 0);
            else if(cnt==1)
            display_bmp("2.bmp", 0, 0);
            else if(cnt==2)
            display_bmp("4.bmp", 0, 0);
            else if(cnt==3)
            {
                superstart();
            }
            else
            printf("change bmp erro!");
        }
        if(x>50&&x<100&&y>250&&y<300)
        {
            for(int i=0;i<8;i++)
            {
                LED_Ctrl(1,0,0);
                usleep(100000);
                LED_Ctrl(0,1,0);
                usleep(100000);
                LED_Ctrl(0,0,1);
                usleep(100000);
            }

        }
        printf("%d",Lux);
        // if(strcmp(send_buf,"unconnect") == 0) //输入unconnect，断开连接
        // {
        //     printf("break !!!\n");
        //     break ;
        // }
         }


}


// void pthread()
// {
//     pthread_t tid;
//     pthread_create(&tid,NULL,my_pthread,NULL);

//     //1.屏幕初始化
//     int fd = LCD_Init();
//    while(1)
//    {
//         GY_39();
//    }
//     // //3.关闭文件
//     close_fd(fd);
// }





int main()
{
     if (init_framebuffer() != 0)
    {
        printf("framebuffer initialization failed\n");
        return -1;
    }
    // step1:装驱动(每次开机之后，都需要将这个驱动文件安装好)
	system("insmod pwm.ko");
    usleep(50000);
    system("insmod led_drv.ko");

    project();


    // 给用户足够时间查看图片（根据需要调整）
    cleanup_framebuffer();
    return 0;
}